from __future__ import absolute_import, division, print_function

import argparse
import os.path
import re
import sys
import tarfile

import numpy as np
import tensorflow as tf
from six.moves import urllib
import csv
import glob

#root_dir = os.getcwd()
#test_dir = 'C:\\code\\newimg'


class NodeLookup(object):
    """Converts integer node ID's to human readable labels."""
    def __init__(self,
                 label_path=None):
        if not label_path:
            tf.logging.fatal('please specify the label file.')
            return
        self.node_lookup = self.load(label_path)

    def load(self, label_path):
        """Loads a human readable English name for each softmax node.
        Args:
          label_lookup_path: string UID to integer node ID.
          uid_lookup_path: string UID to human-readable string.
        Returns:
          dict from integer node ID to human-readable string.
        """
        if not tf.gfile.Exists(label_path):
            tf.logging.fatal('File does not exist %s', label_path)

        # Loads mapping from string UID to human-readable string
        proto_as_ascii_lines = tf.gfile.GFile(label_path).readlines()
        id_to_human = {}
        for line in proto_as_ascii_lines:
            if line.find(':') < 0:
                continue
            _id, human = line.rstrip('\n').split(':')
            id_to_human[int(_id)] = human

        return id_to_human

    def id_to_string(self, node_id):
        if node_id not in self.node_lookup:
            return ''
        return self.node_lookup[node_id]

def create_graph(model_file):
    """Creates a graph from saved GraphDef file and returns a saver."""
    # Creates graph from saved graph_def.pb.
    if not model_file:
        print ('flase')
    with open(model_file, 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        _ = tf.import_graph_def(graph_def, name='')


def run_inference_on_image(image,label_file,model_file):
    """Runs inference on an image.
    Args:
      image: Image file name.
    Returns:
      Nothing
    """

    # if not tf.gfile.Exists(image):
    #     tf.logging.fatal('File does not exist %s', image)
    # image_data = open(image, 'rb').read()

    # Creates graph from saved GraphDef.
    create_graph(model_file)

    with tf.Session() as sess:
        # Some useful tensors:
        # 'softmax:0': A tensor containing the normalized prediction across
        #   1000 labels.
        # 'pool_3:0': A tensor containing the next-to-last layer containing 2048
        #   float description of the image.
        # 'DecodeJpeg/contents:0': A tensor containing a string providing JPEG
        #   encoding of the image.
        # Runs the softmax tensor by feeding the image_data as input to the graph.
        
        softmax_tensor = sess.graph.get_tensor_by_name('final_probs:0')
#         test_image_list = sorted(glob.glob(os.path.join(test_dir,'*.jpg')))
#        csvfile = open('csvtest.csv','a',newline='')
#        csv_write = csv.writer(csvfile,dialect= 'excel')
#        csv_write.writerow(['filename','label'])
#         for image in test_image_list:
#             barenm = os.path.basename(image)
            # predictions,top_k,top_names=run_inference_on_image(image_path)
        image_data = open(image, 'rb').read()
        predictions = sess.run(softmax_tensor,
                               {'input:0': image_data})
        predictions = np.squeeze(predictions)


        # Creates node ID --> English string lookup.
        node_lookup = NodeLookup(label_file)
        num_top_predictions=5
        top_k = predictions.argsort()[-num_top_predictions:][::-1]
        human_string = node_lookup.id_to_string(0)
        top_names = []
        socre1=[]
        for node_id in top_k:
            human_string = node_lookup.id_to_string(node_id)
            top_names.append(human_string)
            score = predictions[node_id]
            socre1.append(score)
       # print (socre1)
            # print('id:[%d] name:[%s] (score = %.5f)' %
            #       (node_id, human_string, score))
        label=top_names[0]+':'+str(socre1[0])
        labelname=[]
        labelname.append(label)
    return labelname
#            print(barenm,':',a)
#            topname=a+b+c+d+e
#            csv_write.writerow([barenm,topname])

#        csvfile.close()
